home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PsL Monthly 1993 December
/
PSL Monthly Shareware CD-ROM (December 1993).iso
/
prgmming
/
dos
/
c
/
rs232.exe
/
RS_DEMO.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-05-03
|
13KB
|
472 lines
/*
RS_DEMO: Terminal program to demonstrate most of the functions
available with RS232.C.
C. Karcher
*/
#include<conio.h>
#include<dos.h>
#include"src\rs232.c" /* full path for rs232.c */
#define BUF_SIZ 1024U /* 1K input and output buffers */
int initialize(char); /* Draws screen and initializes port */
void scr_update(int, int); /* Redefines text window and postions cursor */
void update(int); /* Decodes function keys and takes appropriate
action. Updates port status display */
int end_it(void); /* Restores text window and closes port prior
to exiting */
int loc_echo,add_nl; /* global operating mode flags */
char *in_buf,*out_buf; /* global buffer pointers */
int port_ok;
main()
{
extern int loc_echo,add_nl;
char buf1[BUF_SIZ],buf2[BUF_SIZ],in_lin[BUF_SIZ]; /* declare buffers */
int ip,i_cnt,c,k = 1;
ctrlbrk(end_it); /* set up control/break routine to insure port is
properly close */
in_buf = buf1; /* initialize global buffer pointers */
out_buf = buf2;
port_ok = initialize('1'); /* draw screen and initialize com port 1 */
loc_echo = add_nl = 0; /* init. misc. options */
/* become a terminal */
do{
if(port_ok > 0){ /* if port was initialized succesfully */
if((i_cnt = rs_inrcvd()) != 0){ /* anything in input buffer ? */
if(i_cnt > 1){ /* more than one byte, use rs_getstr to retrieve */
rs_getstr(i_cnt,in_lin);
}
else
*in_lin = rs_getbyt(); /* only one byte, use rs_getbyt */
for(ip = 0;ip < i_cnt;ip++){ /* display received bytes */
c = *(in_lin + ip);
putch(c);
if(add_nl && c == 0x0D) /* add NL to CR if applicable */
putch(0x0A);
}
}
update(0); /* in case any dynamics have changed */
}
if(rs_keyhit()){ /* any keyhits ? */
if((k = getch()) == 0){ /* if first byte 0, it's a function key */
k = getch(); /* get next byte and call update */
update(k);
}
else if(port_ok > 0){ /* otherwise if port's active, send the byte */
while(rs_sndbyt(k)){
if(rs_keyhit()){
k = getch();
if(k == 27)
break;
else
ungetch(k);
}
}
if(loc_echo){ /* display it if local echo on */
putch(k);
if(add_nl && k == 0x0D) /* add NL to CR if applicable */
putch(0x0A);
}
}
}
}while(k != 27); /* fall out if ESC */
end_it();
return 0;
}
void update(int key)
{
int port_update,x_save,y_save,tmp_i;
unsigned tmp_u;
extern int loc_echo,add_nl;
extern char *in_buf,*out_buf;
long baud[] = {110L,300L,600L,1200L,2400L,4800L,9600L,19200L,
38400L,57600L,115200L};
char parity[] = "NEOSM";
char *flow_str[] = {"None","XON/XOFF","CTS","DSR","RI","DCD"};
char *flwstat_str[] = {"Output Enabled","Output Disabled"};
char *line_str[] = {"Off","On"};
char *error_str[] = {"None","Break Detected","Framing Error",
"Parity Error","Rcv Data Overrun",
"Rcv Buffer Overflow"};
static struct{ /* static struct to hold user selectable characteristics */
char port;
int speed;
int par;
char dbits;
char sbits;
int flw_cnt;
int dtr;
int rts;
int loc_echo;
int add_nl;
}select = {'1',4,0,'8','1',RS_FLWOFF,0,0,0,0};
static struct{ /* static struct to hold dynamic statistics */
int flow_stat;
int mod_stat;
unsigned rcv_buf;
unsigned xmit_buf;
int error;
}dynamic;
port_update = 0; /* flag to indicate whether or not port should be closed
and reopened with new parameters */
/* Determine action from key code if one was sent. If port is inactive
except only command to change port number */
if(key != 0 && (port_ok > 0 || key == 0x3B)){
switch(key){
case 0x3B: /* F1 key - port ID */
if(++select.port > '4')
select.port = '1';
select.speed = 4;
select.par = 0;
select.dbits = '8';
select.sbits = '1';
port_ok = initialize(select.port);
break;
case 0x3C: /* F2 key - baud rate */
if(++select.speed > 10)
select.speed = 0;
port_update = 1;
scr_update(25,1);
cprintf("%-6ld",baud[select.speed]);
scr_update(0,0);
break;
case 0x3D: /* F3 key - parity */
if(++select.par > 4)
select.par = 0;
port_update = 1;
scr_update(44,1);
putch(parity[select.par]);
scr_update(0,0);
break;
case 0x3E: /* F4 key - data bits */
if(++select.dbits > '8')
select.dbits = '7';
port_update = 1;
scr_update(61,1);
putch(select.dbits);
scr_update(0,0);
break;
case 0x3F: /* F5 key - stop bits */
if(++select.sbits > '2')
select.sbits = '1';
port_update = 1;
scr_update(78,1);
putch(select.sbits);
scr_update(0,0);
break;
case 0x40: /* F6 key - Set Flow Control */
if(++select.flw_cnt > 5)
select.flw_cnt = 0;
switch(select.flw_cnt){
case 0:
rs_setflow(RS_FLWOFF);
break;
case 1:
rs_setflow(RS_FLWXON,RS_XON,RS_XOFF);
break;
case 2:
rs_setflow(RS_FLWHDW,RS_FLWCTS);
break;
case 3:
rs_setflow(RS_FLWHDW,RS_FLWDSR);
break;
case 4:
rs_setflow(RS_FLWHDW,RS_FLWRI);
break;
case 5:
rs_setflow(RS_FLWHDW,RS_FLWDCD);
break;
}
scr_update(21,3);
cprintf("%-8s",flow_str[select.flw_cnt]);
scr_update(0,0);
break;
case 0x41: /* F7 key - Clear Xmit buffer */
rs_clrout();
break;
case 0x42: /* F8 key - Clear Rcv buffer */
rs_clrin();
break;
case 0x43: /* F9 - toggle DTR */
if(select.dtr == 0){
select.dtr = 1;
rs_modctrl(RS_WRTMCR,RS_MCRDTR,RS_LINON);
}
else{
select.dtr = 0;
rs_modctrl(RS_WRTMCR,RS_MCRDTR,RS_LINOFF);
}
scr_update(10,5);
cprintf("%-3s",line_str[select.dtr]);
scr_update(0,0);
break;
case 0x44: /* F10 - toggle RTS */
if(select.rts == 0){
select.rts = 1;
rs_modctrl(RS_WRTMCR,RS_MCRRTS,RS_LINON);
}
else{
select.rts = 0;
rs_modctrl(RS_WRTMCR,RS_MCRRTS,RS_LINOFF);
}
scr_update(24,5);
cprintf("%-3s",line_str[select.rts]);
scr_update(0,0);
break;
case 0x54: /* sh/F1 key - local echo */
if(select.loc_echo == 1){
select.loc_echo = 0;
loc_echo = 0; /* update global variable */
}
else{
select.loc_echo = 1;
loc_echo = 1; /* update global variable */
}
scr_update(47,5);
cprintf("%-3s",line_str[select.loc_echo]);
scr_update(0,0);
break;
case 0x55: /* sh/F2 key - add newline to carriage return */
if(select.add_nl == 1){
select.add_nl = 0;
add_nl = 0; /* update global variable */
}
else{
select.add_nl = 1;
add_nl = 1; /* update global variable */
}
scr_update(77,5);
cprintf("%-3s",line_str[select.add_nl]);
scr_update(0,0);
break;
case 0x56: /* sh/F3 key - send break */
rs_break();
break;
case 0x57: /* sh/F4 key - send XON */
rs_setflow(RS_FLWINS,RS_XON);
break;
case 0x58: /* sh/F5 key - send XOFF */
rs_setflow(RS_FLWINS,RS_XOFF);
}
}
if(port_ok <= 0) /* don't continue if port is invalid */
return;
if(port_update){ /* new port parameters - close and reopen port */
rs_close();
select.flw_cnt = 0;
scr_update(21,3);
cprintf("%-8s",flow_str[sel